//package com.zhangdi.demo.jdbc.controller;
//
//import com.fasterxml.jackson.core.type.TypeReference;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.zhangdi.demo.jdbc.entity.Area;
//import com.zhangdi.demo.jdbc.mapper.AreaMapper;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.PathVariable;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileReader;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.io.Reader;
//import java.util.ArrayList;
//import java.util.Comparator;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
//@RestController
//public class ReadArea2 {
//    final int PROVINCE = 1;
//    final int CITY = 2;
//    final int COUNTY = 3;
//
//    @Autowired
//    AreaMapper areaMapper;
//
//    @Transactional
//    @GetMapping("area2/{index}")
//    public void getArea(@PathVariable("index") int index) throws IOException {
//        List<Area> provinces = areaMapper.findAll();
//        Map<String, Area> provinceMap = provinces.stream().collect(Collectors.toMap(Area::getName, val -> val));
//
//        List<Area> allareas = read();
//        assert allareas != null;
//        List<Area> areaNodeList = new ArrayList<>();
//        Area root = new Area();
//        root.setId(1);
//        root.setLevelinfo(-1);
//        root.setLft(1);
//        root.setRgt(root.getLft() + 2 * AllChildrenCount(allareas) + 1);
//        root.setName("根");
//        areaNodeList.add(root);
//        areaNodeList.addAll(allareas);
//
//        Area lastArea = root;
//
//        //设置省级已有id
//        for (Area area : areaNodeList) {
//            if (provinceMap.containsKey(area.getName())) {
//                Area province = provinceMap.get(area.getName());
//                area.setId(province.getId());
//                area.setLevelinfo(PROVINCE);
//
//                if (area.getChildren() != null) {
//                    for (Area child : area.getChildren()) {
//                        child.setPid(area.getId());
//                    }
//                }
//            }
//        }
//        areaNodeList.sort(Comparator.comparingInt(Area::getId));
//
//        //计算市区县 左右值
//        for (Area area : areaNodeList) {
//            if (area.getId() == 1) {
//                continue;
//            }
//
//            if (lastArea.getId() == 1) {
//                area.setLft(2);
//            } else {
//                area.setLft(lastArea.getRgt() + 1); //兄弟节点 省
//            }
//
//            area.setChildrencount(childrenCount(area.getChildren()));
//
//            if (area.getChildren().size() == 0) {
//                area.setRgt(area.getLft() + 1);
//            } else {
//                area.setRgt(area.getLft() + 2 * area.getChildrencount() + 1);
//            }
//
//            createCity(area);
//
//            lastArea = area;
//
//            insertFromProvince(area);
//        }
//
////        insertFromProvince(areaNodeList.get(index));
//
//        //省级以下 写入数据库
////        for (Area area : areaNodeList) {
////            areaMapper.insert(area.getChildren());
////
////        }
//    }
//
//    private void createCity(Area province) {
//        if (province == null || province.getChildren() == null || province.getChildren().size() == 0) {
//            return;
//        }
//
//        for (int i = 0; i < province.getChildren().size(); i++) {
//            Area child = province.getChildren().get(i);
//            if (child.getPid() > 0) {
//                child.setLevelinfo(CITY);
//            } else {
//                child.setLevelinfo(COUNTY);
//            }
//
//            if (i == 0) {
//                child.setLft(province.getLft() + 1);
//            } else {
//                child.setLft(province.getChildren().get(i - 1).getRgt() + 1);
//            }
//
//            if (child.getChildren() == null || child.getChildren().size() == 0) {
//                child.setRgt(child.getLft() + 1);
//            } else {
//                child.setChildrencount(childrenCount(child.getChildren()));
//                child.setRgt(child.getLft() + 2 * child.getChildrencount() + 1);
//
//                createCity(child);
//            }
//        }
//    }
//
//    private int childrenCount(List<Area> areas) {
//        if (areas == null || areas.size() == 0) {
//            return 0;
//        }
//
//        int size = areas.size();
//        for (Area child : areas) {
//            size += childrenCount(child.getChildren());
//        }
//
//        return size;
//    }
//
//    private int AllChildrenCount(List<Area> areas) {
//        int size = 0;
//        if (areas == null || areas.size() == 0) {
//            return size;
//        }
//
//        size = areas.size();
//        for (Area area : areas) {
//            size += childrenCount(area.getChildren());
//        }
//
//        return size;
//    }
//
//    private List<Area> read() throws IOException {
//        List<Area> areas;
//
//
//        String path = "F:\\workspace\\zddemo\\jdbc\\src\\main\\resources/pca-code.txt";
//        String jsonStr = "";
//        try {
//            File jsonFile = new File(path);
//            FileReader fileReader = new FileReader(jsonFile);
//            Reader reader = new InputStreamReader(new FileInputStream(jsonFile), "utf-8");
//            int ch = 0;
//            StringBuffer sb = new StringBuffer();
//            while ((ch = reader.read()) != -1) {
//                sb.append((char) ch);
//            }
//            fileReader.close();
//            reader.close();
//            jsonStr = sb.toString();
//
//            ObjectMapper mapper = new ObjectMapper();
//            areas = mapper.readValue(jsonStr, new TypeReference<List<Area>>() {
//            });
//
//            return areas;
//        } catch (IOException e) {
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    private void printByProvinceIndex(Area lastArea) {
//        System.out.println(lastArea.getLevelinfo() + " " + lastArea.getName() + "[" + lastArea.getLft() + ", " + lastArea.getRgt() + "]  " + lastArea.getChildrencount());
//        if (lastArea.getChildren() == null) {
//            return;
//        }
//        for (Area area : lastArea.getChildren()) {
//            if (area.getChildrencount() > 0) {
//                System.out.println("----------------------------------------------------------------------------------------");
//                printByProvinceIndex(area);
//            } else {
//                System.out.println(area.getLevelinfo() + " " + area.getName() + "[" + area.getLft() + ", " + area.getRgt() + "]  " + area.getChildrencount());
//            }
//        }
//    }
//
//    private void insertFromProvince(Area lastArea) {
//        if (lastArea.getChildren() == null) {
//            return;
//        }
//
//        if(lastArea.getChildren().size()> 0){
////            System.out.println(lastArea.getName() + "   "+ lastArea.getChildrencount());
//            areaMapper.insert(lastArea.getChildren());
//        }
//
//        for (Area area : lastArea.getChildren()) {//区县
//            insertFromProvince(area);
//        }
//    }
//}
